from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from django.core.cache import cache

from .models import Area
# Create your views here.

# 获取省级行政区数据
class ProvinceAreasView(View):

    # GET + /areas/
    def get(self, request):
        # 1、提取参数
        # 2、校验参数
        # 3、业务数据处理 —— 过滤省级行政区数据
        # TODO: 通读策略步骤1 —— 读缓存
        province_list = cache.get('province_list') # 缓存命中返回列表，未命中返回None

        # TODO: 通读策略步骤2 —— 读mysql
        if province_list is None:

            province_list = []
            provinces = Area.objects.filter(parent=None)
            # 构建响应参数
            for province in provinces:
                # province是每一个省Area对象
                province_list.append({
                    'id': province.id,
                    'name': province.name
                })
            # TODO: 通读策略步骤3 —— 缓存回填
            cache.set('province_list', province_list, 3600)

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'province_list': province_list
        })


# 获取子级行政区数据
class SubAreasView(View):

    # GET + /areas/<父级行政区id>/
    def get(self, request, pk):
        # 1、提取参数
        # 2、校验参数
        # 3、业务数据处理 —— 根据父级行政区主键值pk过滤子级返回
        # TODO: 通读策略步骤1 —— 读缓存
        sub_data = cache.get('sub_area_%s'%pk)

        # TODO: 通读策略步骤2 —— 缓存未命中读mysql
        if sub_data is None:
            # 3.1、根据路径pk过滤出单一的父级行政区对象
            try:
                parent = Area.objects.get(pk=pk)
            except Exception as e:
                return JsonResponse({'code':400, 'errmsg': '数据不存在'})

            # 3.2、获取parent的子级行政区对象查询集
            sub_query = parent.subs.all()
            subs = []
            for sub in sub_query:
                # sub是每一个子级行政区对象
                subs.append({
                    'id': sub.id,
                    'name': sub.name
                })

            # 组织响应参数
            sub_data = {
                'id': parent.id,
                'name': parent.name,
                'subs': subs
            }

            # TODO：通读策略步骤3：缓存回填
            cache.set('sub_area_%s'%pk, sub_data, 3600)

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': sub_data
        })






